#include<iostream>
double Divide(int a, int b)
{
    //b == 0 时会抛异常
    if (b == 0)
    {
        throw "Divide by zero condition!";
    }
    else
    {
        return (double)a / (double)b;
    }
}
//问题
 //void Func()
 //{
 //    int* array1 = new int[10];//这里出现异常,array1的资源没有申请成功,抛出异常后自动释放栈上资源没有任何问题
 //    int* array2 = new int[10];//这里出现异常,会导致array1中申请的堆资源无法释放导致内存泄露
 //    try 
 //    {
 //        int len,time;
 //        std::cin >> len >> time;
 //        std::cout << Divide(len,time) << std::endl;
 //    }
 //    catch(...)
 //    {
 //        std::cout << "delete[]" << array1 << std::endl;
 //        std::cout << "delete[]" << array2 << std::endl;
 //        delete[] array1;
 //        delete[] array2;
 //        throw;//这里我们不做拦截,异常一般交给外层函数去处理
 //    }
 //}

 void Func()
 {
     int* array1 = new int[10];//这里出现异常,array1的资源没有申请成功,抛出异常后自动释放栈上资源没有任何问题
     int* array2 = new int[10];//这里出现异常,会导致array1中申请的堆资源无法释放导致内存泄露
     
     int len, time;
    std::cin >> len >> time;
    std::cout << Divide(len, time) << std::endl;//这里异常会导致内存泄露,因为下面的代码得不到执行
     
     
    std::cout << "delete[]" << array1 << std::endl;
    std::cout << "delete[]" << array2 << std::endl;
    delete[] array1;
    delete[] array2;
     
 }
//解决问题模拟智能指针
//template <class T>
//class Smartptr
//{
//public:
//    Smartptr(T* ptr)
//        :_ptr(ptr)
//    {
//
//    }
//    ~Smartptr()
//    {
//        std::cout << "delete[]" << std::endl;
//        delete[] _ptr;
//    }
//    //RAII还支持访问资源
//    T& operator*()
//    {
//        return *_ptr;
//    }
//    T& operator[](size_t t)
//    {
//        return _ptr[t];
//    }
//    T* operator->()
//    {
//        return _ptr;
//    }
//private:
//    T* _ptr;
//};
//void Func()
//{
//    //这里使用了RAII的智能指针类来管理数组,管理资源
//    Smartptr<int> sp1 = new int[10];
//    Smartptr<int> sp2 = new int[10];
//    int len, time;
//    std::cin >> len >> time;
//    std::cout << Divide(len, time) << std::endl;
//    for (int i = 0; i < 10; i++)
//    {
//        sp1[i] = sp2[i] = i + 1;
//    }
//
//}
int main()
{
    try
    {
        Func();
    }
    catch (const char* errmsg)
    {
        std::cout << errmsg << std::endl;
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    catch (...)
    {
        std::cout << "未知异常" << std::endl;
    }
    return 0;
}